package zsrt.com.dao.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import zsrt.com.dao.ExamineeBusinessDao;
import zsrt.com.dao.ExamineeDao;
import zsrt.com.excel.SetValue;
import zsrt.com.excel.GetValue;
import zsrt.com.utils.MapSort;
import zsrt.com.validate.Validate;

/**
 * 考生业务类的实现类
 * @author 罗智壕-13424431416
 *
 * 2017年4月21日
 */
public class ExamineeBusinessDaoImpl implements ExamineeBusinessDao{
	/**
	 * 查看个人信息包括分数
	 * @param examiness		需要查询的容器
	 */
	public void examineeFindMessage(){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		//登录校验的时候定义了一个全局变量方便拿到当前用户的全部信息
		ExamineeDao examineeDao = map.get(Validate.userId);
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
		System.err.println(examineeDao);
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
	}
	
	/**
	 * 修改个人信息（分数、准考证号码不能修改）
	 * @param examiness
	 * @param examineeDao
	 */
	public void examineeUpdateMessage(ExamineeDao examineeDao){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		ExamineeDao examineeObject = map.get(examineeDao.getId());
		String password = examineeDao.getPassword();
		//将新的密码覆盖到原来的密码
		examineeObject.setPassword(password);
		//再次导出到excel，简单的意思就是刷新excel
		SetValue.bmsRRnoExcel(map);
	}
	
	/**
	 * 查询本市(登录用户所在的城市)的总分状元
	 * @param examiness		需要查询的容器
	 */
	public void examineeTotalScore(){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		//登录校验的时候定义了一个全局变量方便拿到当前用户的全部信息
		ExamineeDao examineeDao = map.get(Validate.userId);
		String city = examineeDao.getCity();
		Double total = examineeDao.getTotal();
		//获取map中的考生对象
		Collection<ExamineeDao> values = map.values();
		//这个变量是是存id，到时候通过键的方式拿到属性
		String id = null;
		for(ExamineeDao dao : values){
			//这个类似求最大值
			if(dao.getCity().equals(city)){
				if(dao.getTotal() > total){
					id = dao.getId();
				}
			}
		}
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
		if(null == id){
			System.err.println(map.get(Validate.userId));
		}else{
			System.err.println(map.get(id));
		}
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
	}
	
	/**
	 * 查询指定城市的状元
	 * @param city			指定的城市
	 */
	public void examineeTotalCity(String city){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		//获取map中的考生对象
		Collection<ExamineeDao> values = map.values();
		//这个变量是是存id，到时候通过键的方式拿到属性
		String id = null;
		for(ExamineeDao dao : values){
			String oldCity = dao.getCity();
			if(city.equals(oldCity)){
				id = dao.getId();
			}
		}
		//如果map是空的化，代表这个城市不存在
		if(null != map.get(id)){
			System.err.println("-------------------------------------------------------"
					+ "----------------------------------------------------");
			System.err.println(map.get(id));
			System.err.println("-------------------------------------------------------"
					+ "----------------------------------------------------");
		}else{
			System.err.println("你输入的城市不存在...");
		}
	}
	
	/**
	 * 查询各个省份500-600分的总人数并由高到低排列显示
	 */
	public void examineeCitySort(){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		//调用工具类的升序方法
		HashMap<String, ExamineeDao> newMap = MapSort.mapSortDesc(map);
		//获取map中的考生对象
		Collection<ExamineeDao> values = newMap.values();
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
		for(ExamineeDao dao : values){
			Double total = dao.getTotal();
			//这是查询条件
			if(total >= 500 && total <= 650){
				System.err.println(dao);
			}
		}
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
	}
	
	/**
	 * 查询各个省份过600分的总人数并由低到高排列显示
	 */
	public void examineeCityOrderBy(){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		//调用工具类的升序方法
		HashMap<String, ExamineeDao> newMap = MapSort.mapSortOrderBy(map);
		//获取map中的考生对象
		Collection<ExamineeDao> values = newMap.values();
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
		for(ExamineeDao dao : values){
			Double total = dao.getTotal();
			//查询条件
			if(total >= 600){
				System.err.println(dao);
			}
		}
		System.err.println("-------------------------------------------------------"
				+ "----------------------------------------------------");
	}
	
	@Test
	public void testName() throws Exception {
		examineeEveryCityScholar();
	}
	
	/**
	 * 查询全国各个省份的状元
	 */
	public void examineeEveryCityScholar(){
		//从excel表格拿到数据存储到map
		Map<String, ExamineeDao> map = GetValue.getValue();
		//用来装省份的容器
		List<String> list = new ArrayList<String>();
		//获取map中的考生对象
		Collection<ExamineeDao> values = map.values();
		boolean result = false;
		for(ExamineeDao dao : values){
			//每次初始化
			result = false;
			String city = dao.getCity();
			//防止空指针
			if(null != city){
				//如果长度为0，则加进去
				if(list.size() == 0){
					list.add(city);
				}else{
					for(int index=0; index<list.size(); index++){
						//获取到list中的城市
						String listCity = list.get(index);
						//如果相同，代表list中已经存在了，跳出循环
						if(listCity.equals(city)){
							result = true;
							break;
						}
					}
					//如果循环完list还是等于false，就装进list
					if(!result){
						list.add(city);
					}
				}
			}
		}
		
		//新数组装有所有的户籍所在地
		Map<String,String> newList = new HashMap<String,String>();
		//定义一个成绩
		Double total = 0.00;
		String id = null;
		for(int index=0; index<list.size(); index++){
			//每次要初始化
			total = 0.00;
			//获取到户籍所在地
			String strCity = list.get(index);
			for(ExamineeDao dao : values){
				//拿到对象中的户籍所在地
				String city = dao.getCity();
				//判断户籍所在地是否相同
				if(city.equals(strCity)){
					//如果对象的总分大于需求
					if(dao.getTotal() >= total){
						total = dao.getTotal();
						id = dao.getId();
					}
				}
			}
			newList.put(strCity, id);
		}
		
		//里面是输出
		print(map, newList);
	}
	
	/**
	 * 进行输出
	 * @param map		需要打印的容器
	 * @param newList	新容器是装有户籍所在地和id
	 */
	public void print(Map<String, ExamineeDao> map, Map<String, String> newList) {
		Collection<String> newId = newList.values();
		//拿键出来进行美观
		Set<String> keySet = newList.keySet();
		Iterator<String> iterator = keySet.iterator();
		String[] keyArrays = new String[newList.size()];
		int i = 0;
		while(iterator.hasNext()){
			keyArrays[i] = iterator.next();
			i++;
		}
		i = 0;
		for(String str : newId){
			System.err.println("------------------------------"+keyArrays[i]+"--------------------"
					+ "----------------------------------------------------");
			//老容器进行打印，str就是老容器的键
			System.err.println(map.get(str));
			System.err.println("-------------------------------------------------------"
					+ "----------------------------------------------------");
			i++;
		}
	}
}
